<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="resources/shadow-dom.js"></script>

<div id="root0">
  <div id="host1">
    <template id="root1" data-mode="open">
      <div id="host2">
        <template id="root2" data-mode="open">
          <div id="parent">
            <div id="child"></div>
          </div>
        </template>
      </div>
    </template>
  </div>
</div>

<script>
test(() => {
  let n = createTestTree(root0);
  document.body.appendChild(n.host1);
  assert_equals(n.host1.getRootNode(), document);
  assert_equals(n.root1.getRootNode(), n.root1);
  assert_equals(n.host2.getRootNode(), n.root1);
  assert_equals(n.root2.getRootNode(), n.root2);
  assert_equals(n.parent.getRootNode(), n.root2);
  assert_equals(n.child.getRootNode(), n.root2);

  assert_equals(n.host1.getRootNode({ composed: true }), document);
  assert_equals(n.root1.getRootNode({ composed: true }), document);
  assert_equals(n.host2.getRootNode({ composed: true }), document);
  assert_equals(n.root2.getRootNode({ composed: true }), document);
  assert_equals(n.parent.getRootNode({ composed: true }), document);
  assert_equals(n.child.getRootNode({ composed: true }), document);
  n.host1.remove();
}, 'getRootNode(...) in a connected tree.');

test(() => {
  let n = createTestTree(root0);
  assert_equals(n.root0.getRootNode(), n.root0);
  assert_equals(n.host1.getRootNode(), n.root0);
  assert_equals(n.root1.getRootNode(), n.root1);
  assert_equals(n.host2.getRootNode(), n.root1);
  assert_equals(n.root2.getRootNode(), n.root2);
  assert_equals(n.parent.getRootNode(), n.root2);
  assert_equals(n.child.getRootNode(), n.root2);

  assert_equals(n.root0.getRootNode({ composed: true }), n.root0);
  assert_equals(n.host1.getRootNode({ composed: true }), n.root0);
  assert_equals(n.root1.getRootNode({ composed: true }), n.root0);
  assert_equals(n.host2.getRootNode({ composed: true }), n.root0);
  assert_equals(n.root2.getRootNode({ composed: true }), n.root0);
  assert_equals(n.parent.getRootNode({ composed: true }), n.root0);
  assert_equals(n.child.getRootNode({ composed: true }), n.root0);
}, 'getRootNode(...) in a disconnected tree.');

test(() => {
  let n = createTestTree(root0);
  assert_equals(n.host2.getRootNode({ composed: false }), n.root1);
}, 'getRootNode({ composed: false }) should be the default behavior.');
</script>
